/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.tamagochi.logica;

import br.com.tamagochi.bean.Tamagochi;
import br.com.tamagochi.dao.LogicaDao;
import br.com.tamagochi.dao.TamagochiDao;
import br.com.tamagochi.view.ViewObserve;
import java.util.Properties;

/**
 * Esta classe é responsavel por abstrair a complexidade do codigo 
 * utilizando da logica para redirecionar a classe que contem a logica de execução das partes,
 * Mais conhecido como Fachada, ela ira esconder o codigo real da aplicação, ou seja encapsular.
 * 
 * @author Allan & Fabiana
 * @author Kamilla Cardoso
 */
public class Facade {
    
    
    private Logica logica;
    
    /**
     * Metodo responsavel por criar um novo jogo,
     * Da inicio ao jogo, inicializando o bicho virtual no seu estado padrão.
     * 
     * @param vob 
     */
    public void novoJogo(ViewObserve vob) {
        
        if(this.logica != null && this.logica.isAlive()){
            this.logica.setRunning(false);
        }
        
        Properties properties = new TamagochiDao().carregamentoEstadoPadrao();

        Tamagochi tamagochi = new Tamagochi(properties);
        tamagochi.addViewObserver(vob);

        properties = new LogicaDao().carregaLogica();

        logica = new Logica(properties);
        logica.setPriority(Thread.MIN_PRIORITY);
        logica.addViewObserver(vob);
        logica.setTamagochi(tamagochi);
        logica.start();

    }
    
    /**
     * Metodo responsavel por carregar o jogo, de forma a executar internamente os processos ---.
     * 
     * @return void
     */
    public void carregarJogo(String path, ViewObserve vob){
        
        if(this.logica != null && this.logica.isAlive()){
            this.logica.setRunning(false);
        }
        
        Properties properties = new TamagochiDao().carregaEstado(path);

        Tamagochi tamagochi = new Tamagochi(properties);
        tamagochi.addViewObserver(vob);

        properties = new LogicaDao().carregaLogica();

        logica = new Logica(properties);
        logica.setPriority(Thread.MIN_PRIORITY);
        logica.addViewObserver(vob);
        logica.setTamagochi(tamagochi);
        logica.start();
    }
    
    public void salvarJogo(String pathFile){
        Properties properties = this.logica.getTamagochiPropeties();
        
        new TamagochiDao().salvarEstado(properties, pathFile);
        
    }
    
    /**
     * 
     * @param index 
     */
    public void dormir(int index){
        this.logica.dormir(index);
    }
    
    public void comer(int index){
        this.logica.comer(index);
    }
    
    public void brincar(int index){
        this.logica.brincar(index);
    }
    
    public void brincarLeft(){
        this.logica.brincarLeft();
    }
    
    public void brincarRight(){
        this.logica.brincarRight();
    }
    
    public boolean estaJogando(){
        return logica != null;
    }
    
}
